//
//  SJStatus.swift
//  SJWeiboSwift
//
//  Created by app;e on 15/10/5.
//  Copyright © 2015年 world. All rights reserved.
//

import UIKit
import SDWebImage

private let WeiBo_Home_Timeline = "2/statuses/home_timeline.json"

class SJStatus: NSObject {

    // MARK:- 模型属性
    /// 微博创建时间
    var created_at: String?
    /// 微博ID
    var id: Int = 0
    /// 微博信息内容
    var text: String?
    /// 微博来源
    var source: String?{
        didSet{
            if let result = source?.hrefLink() {
                source = result.text
            }
        }
    }
    /// 配图数组
    var pic_urls: [[String: String]]?{
        //pic_urls的属性监听,当pic_urls赋值后就会遍历pic_urls转成imageURLs的数组
        didSet{
            //图片URL数组
            imageURLs = [NSURL]()
            largeImageURLs = [NSURL]()
            for dict in pic_urls!{
                var urlString = dict["thumbnail_pic"]!
                //缩略图url数组
                imageURLs!.append(NSURL(string: urlString)!)
                //大图
                urlString = urlString.stringByReplacingOccurrencesOfString("thumbnail", withString: "large")
                largeImageURLs?.append(NSURL(string: urlString)!)
            }
        }
    }
    /// 配图URL数组
    private var imageURLs: [NSURL]?
 /// 计算型属性,配图的URL数组
    ///如果是转发微博,只需要缓存转发微博的imageURLs 原创的imageURLs为nil
    ///如果是原创微博, imageURLs 可能有内容
    var picURLs: [NSURL]?{
        return retweeted_status != nil ? retweeted_status?.imageURLs : imageURLs
    }
 /// 大图的URL数组
    private var largeImageURLs:[NSURL]?
    var largePicURLs: [NSURL]?{
        return retweeted_status != nil ? retweeted_status?.largeImageURLs : largeImageURLs
    }
    
    /// 用户
    var user : SJUser?
 /// 被转发的原微博信息字段,当该微博为转发微博时返回
    var retweeted_status:SJStatus?
    
    ///类属性  类属性的好处,全局只有一份, 如果是对象属性, 那么每创建一个出一个对象,内存中就会有一份
    //属性数组
    static let properties = ["created_at","id","text","source","pic_urls","user","retweeted_status"]
    
    ///重写description方法
   override var description:String{
        let dict = dictionaryWithValuesForKeys(SJStatus.properties)
        return "\(dict)"
    }
    
    
    ///字典转模型方法
    init(dict: [String:AnyObject]) {
        super.init()
        //遍历属性数组
        for key in SJStatus.properties {
            
            if dict[key] == nil || key == "user" || key == "retweeted_status"{
                continue
            }
                //使用kvc 必须要调用super.init
                setValue(dict[key], forKey: key)
            
            if let userDict = dict["user"] as? [String: AnyObject] {
                user = SJUser(dict: userDict)
            }
            
            if let retweetedDict = dict["retweeted_status"] as? [String: AnyObject]{
                retweeted_status = SJStatus(dict: retweetedDict)
            }
        }
    }
    
    /**
    加载数据: since_id 与 max_id不能同时为0,或者同时有值
    - parameter since_id: 若指定此参数，则返回ID比since_id大的微博（即比since_id时间晚的微博），默认为0。
    - parameter max_id	: 若指定此参数，则返回ID小于或等于max_id的微博，默认为0。
    */
    class func loadStauts(max_id:Int,since_id:Int,finished:(statuses:[SJStatus]?,error:NSError?)->()) {
        
        assert(sharedUserAccount != nil, "必须登录之后才能访问网络")
        
        var param = ["access_token":sharedUserAccount!.access_token]
        if since_id > 0{
           param["since_id"] = "\(since_id)"
        }
        if max_id > 0 {
            param["since_id"] = "0"
            //max_id 返回ID小于或等于max_id的微博,为了避免有一条重复的微博,所以加载max_id -1
            param["max_id"] = "\(max_id-1)"
        }
        
        SJNetWorkTools.sharedNetWorkTools().GET(WeiBo_Home_Timeline, parameters: param, success: { (_, json) -> Void in
            //array是一个 存储[string:anyObject]字典的数组
            if let array = json["statuses"] as? [[String: AnyObject]]{
                //获取status模型数组
                let list = statusesWithArray(array)
                //请求成功,也有数据,调用图片缓存方法
                cacheWebImages(list, finished: finished)
                return
                }
            //如果请求成功但是 数据为空的回调
            finished(statuses: nil, error: nil)
            
            }) { (_, error) -> Void in
                print(error)
                //请求错误后的回调
                finished(statuses: nil, error: error)
        }
    }
    /**
    缓存微博数组中所有的图像
    
    - parameter list: 微博模型数组
    */
    private class func cacheWebImages(list:[SJStatus],finished:(statuses:[SJStatus]?,error:NSError?)->()){
       
        //1.自定义调度组
        let group = dispatch_group_create()
        
        for st in list {
            
            //数组不存在 或者 数组元素为空
            if st.picURLs == nil || st.picURLs!.isEmpty{
                continue
            }
            //2.遍历picURLs
            for url in st.picURLs! {
                //3.加入调度组
                dispatch_group_enter(group)
                
                //4.缓存图片到沙盒
                SDWebImageManager.sharedManager().downloadImageWithURL(url, options: SDWebImageOptions(rawValue: 0), progress: nil, completed: { (_, _, _, _ , _) -> Void in
                    //5.缓存完毕 出组
                    dispatch_group_leave(group)
                })
            }
        }
        
        //6.监听调度组的完成
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
            //图片缓存完成
            finished(statuses: list, error: nil)
        }
        
    }
    
    /// 使用传入的[String:AnyObject]字典数组，完成网络模型转 Status 数组
    private class func statusesWithArray(array:[[String:AnyObject]])->[SJStatus]{
        //定义一个可变数组
        var arrayM = [SJStatus]()
        
        for dict in array {
            let status = SJStatus(dict: dict)
            arrayM.append(status)
        }
        
        return arrayM
    }
}
